#ifndef _CASE_H
#define _CASE_H
/*
    聊天室
    编写：林泽龙
    功能：实现局域网内自由聊天，文件传输（仅限服务机对客服传输），反向有bug。
    服务机功能：屏蔽客服机信息，收到新的客服机广播通知其余客服机，对指定用户私聊。
    展示所有连接中的成员ip。
    客服机：接收文件，接收信息，接收广播信息。
*/
#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <unistd.h>
#include <linux/input.h>
#include <linux/fb.h>
#include <sys/ioctl.h>
#include <stdbool.h>
#include <strings.h>
#include <sys/stat.h>
#include <dirent.h>
#include <string.h>
#include <sys/wait.h>
#include <signal.h>
#include <sys/shm.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <semaphore.h>
#include <pthread.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <errno.h>


//结构体用以存放文件信息
struct file_info
{
    char filename[100];
    int pid;
    struct stat msg;
};


//链表结构体
typedef struct node
{
    int fd_msg;
    char ip[100];
    struct node * next;
}ND,*PND;


//存放IP地址等文件信息
struct fd_ip_t
{
	int fd_info;
	struct sockaddr_in ip;
};


//服务机所用函数
PND list_init(void);//链表创建
PND make_node(int n,char * ipmsg);//设置头节点
bool insert_node(PND phead,PND pnew);//插入节点
void broadcast(struct sockaddr_in msg,int fdnum,struct sockaddr_in ip);//广播通知
void recv_file(PND pnode);//接收文件
void *msg_recv(void * arg);//线程1：接收信息
void *accept_client(void * arg);//线程2：接收新连接用户
void show_mem(PND phead);//展示已连接客户信息
int chatting(PND pnode);//对指定用户私聊
void send_file(PND pnode);//发送文件


//客服机所用函数
void * recv_msg(void * arg);//线程1：接收信息
void * udp_recv(void * arg);//线程2：接收广播信息
void * recv_sfile(void * arg);//线程3：接收文件
void file_trans();//线程4：发送文件（未完全开发）
#endif